package us.wili.dev.third.util.example.cases;

import com.github.binarywang.wxpay.bean.entpay.EntPayRequest;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.Map;

/**
 * 微信支付示例
 * 示例只阐述了工具的部分方法，更多方法的使用，请对比文档
 * <p>
 * 企业付款文档地址：https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1
 * <p>
 * author: lefore
 * date: 2018/9/30
 */
public class WxpayCase {

    private static final Logger logger = LoggerFactory.getLogger(WxpayCase.class);

    @Autowired
    private WxPayService wxPayService;

    // ------------------------ 支付相关 ------------------------

    /**
     * 预下单
     */
    public void createOrder() {
        WxPayUnifiedOrderRequest req = WxPayUnifiedOrderRequest.newBuilder()
                // 商品描述
                .body("过路费")
                // 订单总金额，单位为分
                .totalFee(888)
                // 终端IP
                .spbillCreateIp("123.12.12.123")
                // 支付回调地址
                .notifyUrl("http://case.wili.us/payCallback")
                // JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付
                .tradeType(WxPayConstants.TradeType.APP)
                // 商户订单号
                .outTradeNo("wili_tradeNo")
                .build();

        try {
            Map<String, String> payInfo = wxPayService.createOrder(req);
        } catch (WxPayException e) {
            logger.error("获取支付参数失败", e);
        }
    }

    /**
     * 需要在 Controller 中定义的支付回调方法
     *
     * @param payNotifyResult
     * @return
     */
    @RequestMapping(value = "/payCallback", method = RequestMethod.POST)
    public String appPayCallbackForOfficial(@RequestBody String payNotifyResult) {
        try {
            WxPayOrderNotifyResult result = wxPayService.parseOrderNotifyResult(payNotifyResult);
            if ("SUCCESS".equals(result.getReturnCode()) && "SUCCESS".equals(result.getResultCode())) {
                logger.info("支付成功");
                return getCallbackResponse(true);
            }
            logger.error("支付失败");
        } catch (Exception e) {
            logger.error("支付失败", e);
        }
        return getCallbackResponse(false);
    }

    private String getCallbackResponse(boolean success) {
        return success ? "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"
                : "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[e.getMessage]]></return_msg></xml>";
    }

    // ------------------------ 企业付款（提现）相关 ------------------------

    /**
     * 企业付款到零钱
     * <p>
     */
    public void entPay() {
        EntPayRequest req = EntPayRequest.newBuilder()
                // 商户订单号
                .partnerTradeNo("Eb6Aep7uVTdbkJqrP4")
                // 用户openid
                .openid("ojOQA0y9o-Eb6Aep7uVTdbkJqrP5")
                // 金额，单位：分
                .amount(100)
                // Ip地址
                .spbillCreateIp("10.10.10.10")
                // 校验用户姓名选项
                .checkName(WxPayConstants.CheckNameOption.NO_CHECK)
                // 企业付款描述信息
                .description("描述信息")
                .build();

        try {
            wxPayService.getEntPayService().entPay(req);
        } catch (WxPayException e) {
            e.printStackTrace();
        }
    }
}
